[C#] Convert string to double with 2 digit after decimal separator

Posted by st.stoqnov on Stack Overflow See other posts from Stack Overflow or by st.stoqnov
Published on 2009-10-19T10:45:18Z Indexed on 2010/05/18 3:20 UTC
Read the original article Hit count: 1153

All began with these simple lines of code:

string s = "16.9";
double d = Convert.ToDouble(s);
d*=100;

The result should be 1690.0, but it's not. d is equal to 1689.9999999999998. All I want to do is to round a double to value with 2 digit after decimal separator. Here is my function.

private double RoundFloat(double Value)
{
    float sign = (Value < 0) ? -0.01f : 0.01f;

    if (Math.Abs(Value) < 0.00001) Value = 0;

    string SVal = Value.ToString();
    string DecimalSeparator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
    int i = SVal.IndexOf(DecimalSeparator);
    if (i > 0)
    {
        int SRnd;
        try
        {
            // ????? ??????? ????? ???? ?????????? ??????????
            SRnd = Convert.ToInt32(SVal.Substring(i + 3, 1));
        }
        catch
        {
            SRnd = 0;
        }

        if (SVal.Length > i + 3)
            SVal = SVal.Substring(0, i + 3);
        //SVal += "00001";

        try
        {
            double result = (SRnd >= 5) ? Convert.ToDouble(SVal) + sign : Convert.ToDouble(SVal);
            //result = Math.Round(result, 2);
            return result; 
        }
        catch
        {
            return 0;
        }
    }
    else
    {
        return Value;
    }

But again the same problem, converting from string to double is not working as I want. A workaround to this problem is to concatenate "00001" to the string and then use the Math.Round function (commented in the example above).

This double value multiplied to 100 (as integer) is send to a device (cash register) and this values must be correct.

I am using VS2005 + .NET CF 2.0

Is there another more "elegant" solution, I am not happy with this one.

© Stack Overflow or respective owner

Related posts about c#

Related posts about .NET